package de.htwds.mada.todolistDB;

import java.sql.SQLException;
import java.util.Date;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.DatePicker.OnDateChangedListener;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import de.htwds.mada.R;
import de.htwds.mada.todolistDB.model.Priority;
import de.htwds.mada.todolistDB.model.Todo;

public class TODODBDetailsActivity extends Activity {
	
//------------------------- Felder ---------------------------------//
	private EditText  	eingabeBeschreibung;
	private EditText  	eingabeBezeichnung;
	private Spinner 	priority;
	private Button 		category;
	private DatePicker 	date;
	private Todo 		element = null;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.tododb_details);
		
		eingabeBeschreibung 	= (EditText) findViewById(R.id.txtDetailsBeschreibung);
		eingabeBezeichnung 		= (EditText) findViewById(R.id.txtDetailsBezeichnung);
		priority 				= (Spinner) findViewById(R.id.sprPriority);
		category 				= (Button) findViewById(R.id.btnAddCategory);
		date         			= (DatePicker) findViewById(R.id.dpDate);
		
		spinnerContent();
		
		Button save = (Button) findViewById(R.id.btnDetailsSave);
		Button delete = (Button) findViewById(R.id.btnDetailsDelete);
		
		element = (Todo) getIntent().getParcelableExtra("object");
		if(element != null){
			//Log.d("Get-Extra", "Objekt bekommen");
			fillFields(element);
		}		
		
		save.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				createOrUpdateToDo();	
				Toast.makeText(TODODBDetailsActivity.this, R.string.db_entry_created, Toast.LENGTH_SHORT).show();
//				clearFields();
				finish();
			}
		});
		
		delete.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				if(element != null){
					try {
						TODODBListActivity.db.deleteTodo(element);
						finish();
					} catch (SQLException e) {
						Toast.makeText(TODODBDetailsActivity.this, R.string.error_db_write, Toast.LENGTH_SHORT).show();
						e.printStackTrace();
					}
				} else {
					Toast.makeText(TODODBDetailsActivity.this, R.string.todo_db_details_nothing_deleted, Toast.LENGTH_SHORT).show();
				}
				clearFields();
			}
		});
		
		category.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				createOrUpdateToDo();
				if (element != null) {
					Intent myIntent = new Intent(TODODBDetailsActivity.this, TODODBTodoCatActivity.class);
					myIntent.putExtra("object", element);
					TODODBDetailsActivity.this.startActivity(myIntent);
				}
			}
		});
	}
	
	/**
	 * Die Methode legt das ToDo-Objekt an oder bearbeitet is in der DB
	 */
	private void createOrUpdateToDo(){
		if(checkInput()){
			Date datum;
			datum = new Date(date.getYear(), date.getMonth(), date.getDayOfMonth());
			if(element == null)
				element = new Todo(eingabeBezeichnung.getText().toString().trim(),
								   eingabeBeschreibung.getText().toString().trim(),
								   datum,
								   (Priority)priority.getSelectedItem());
			else {
				element.setDate(datum);
				element.setDesc(eingabeBeschreibung.getText().toString().trim());
				element.setPrio((Priority)priority.getSelectedItem());
				element.setTitle(eingabeBezeichnung.getText().toString().trim());
			}
				
			try {
				TODODBListActivity.db.createOrUpdateTodo(element);
			} catch (SQLException e) {
				Toast.makeText(TODODBDetailsActivity.this, R.string.error_db_write, Toast.LENGTH_SHORT).show();
				e.printStackTrace();
			}
		} else {
			Toast.makeText(TODODBDetailsActivity.this, R.string.todo_db_details_error_fields, Toast.LENGTH_SHORT).show();
		}
	}
	
	/**
	 * Prueft die Eingabefelder vor dem speichern und stellt sicher, dass diese befuellt sind
	 * 
	 * @return true wenn ok, sonst false
	 */
	private boolean checkInput(){
		if(eingabeBeschreibung.getText().toString().trim() != null &&
		   eingabeBezeichnung.getText().toString().trim() != null &&
		   priority.getSelectedItem() != null &&
		   date.toString() != null)
			return true;
		else
			return false;
	}
	
	/**
	 * Die Daten, die der Spinner beinhalten soll werden aus der DB gelesen
	 */
	private void spinnerContent(){
		
		List<Priority> list = null;
		try {
			list = TODODBListActivity.db.getPriorities(); //Datenbank-Zugriff
		} catch (SQLException e) {
			e.printStackTrace();
			Toast.makeText(TODODBDetailsActivity.this, R.string.error_db_write, Toast.LENGTH_SHORT).show();
		}
		
		
		ArrayAdapter<Priority> dataAdapter = new ArrayAdapter<Priority>(this, android.R.layout.simple_spinner_item, list);
		dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		priority.setAdapter(dataAdapter);
		
		dataAdapter.notifyDataSetChanged();
	}
	
	/**
	 * Loescht alle Eingabefelder und setzt sie auf den Standard zurueck
	 */
	private void clearFields(){
		eingabeBeschreibung.setText("");
		eingabeBezeichnung.setText("");
	}
	
	/**
	 * Die Methode fuellt die Felder der View mit den Daten aus dem todo-Parameter
	 * 
	 * @param todo - todo-Element, dass aus der Datenbank gelsen wurde
	 */
	private void fillFields(Todo todo){
		eingabeBeschreibung.setText(todo.getDesc());
		eingabeBezeichnung.setText(todo.getTitle());
		spinnerContent();
		int i = 0;
		boolean set = false
				;
		while(i < priority.getAdapter().getCount()){
			if(priority.getAdapter().getItem(i).equals(todo.getPrio())){
				priority.setSelection(i);
				set = true;
			}
			i++;
			if(!set)
				priority.setSelected(false);
		}

		date.init(todo.getDate().getYear(), todo.getDate().getMonth(), todo.getDate().getDay(), new OnDateChangedListener() {	
			@Override
			public void onDateChanged(DatePicker view, int year, int monthOfYear,
					int dayOfMonth) {}
		});
	}
}
